home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / util / nodelete / part01
Encoding:
Internet Message Format  |  1990-10-15  |  25.6 KB

  1. Path: wuarchive!bcm!dimacs.rutgers.edu!rutgers!usc!elroy.jpl.nasa.gov!abcfd20.larc.nasa.gov!amiga-request
  2. From: amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v90i286: nodelete 1.35e - intercept DeleteFile() requests, Part01/01
  5. Message-ID: <comp.sources.amiga:v90i286@abcfd20.larc.nasa.gov>
  6. Date: 14 Oct 90 19:25:39 GMT
  7. Reply-To: hoover@math4.uni-bielefeld.de (Uwe Sch"urkamp)
  8. Lines: 716
  9. Approved: tadguy@uunet.UU.NET (Tad Guy)
  10. X-Mail-Submissions-To: amiga@uunet.uu.net
  11. X-Post-Discussions-To: comp.sys.amiga
  12.  
  13. Submitted-by: hoover@math4.uni-bielefeld.de (Uwe Sch"urkamp)
  14. Posting-number: Volume 90, Issue 286
  15. Archive-name: util/nodelete-1.35e/part01
  16.  
  17. [ uuencoded executable enclosed  ...tad ]
  18.  
  19. NoDelete  enables  you  erraneous  humans  to  once  again  reflect  on the
  20. righteousness  of  your  decisions  concerning  the  deleting  of  files on
  21. AmigaDos devices.  If you try to delete a file or a program tries to remove
  22. it,  this  is  mostly  done  via  DeleteFile()  of  the  dos.library.  When
  23. executed,  NoDelete  bends  this  vector to its own routine which brings up
  24. this  cute  little requester on the active window.  This requester contains
  25. the  name  of  the file that the system is trying to delete.  If you really
  26. want  to  delete  this  file,  click to the "Yes, Delete!" gadget.  If not,
  27. click  to the "Oops, no way!"-Gadget of the requester.
  28.  
  29. #!/bin/sh
  30. # This is a shell archive.  Remove anything before this line, then unpack
  31. # it by saving it into a file and typing "sh file".  To overwrite existing
  32. # files, type "sh file -c".  You can also feed this as standard input via
  33. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  34. # will see the following message at the end:
  35. #        "End of archive 1 (of 1)."
  36. # Contents:  nodelete.c nodelete.doc nodelete.uu readme.txt
  37. # Wrapped by tadguy@abcfd20 on Sun Oct 14 15:25:38 1990
  38. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  39. if test -f 'nodelete.c' -a "${1}" != "-c" ; then 
  40.   echo shar: Will not clobber existing file \"'nodelete.c'\"
  41. else
  42. echo shar: Extracting \"'nodelete.c'\" \(7779 characters\)
  43. sed "s/^X//" >'nodelete.c' <<'END_OF_FILE'
  44. X/* NoDelete V1.35E (C) HooverSoft 1990
  45. X
  46. X   cc NoDelete +L
  47. X   ln NoDelete -lc32
  48. X
  49. X
  50. X*/
  51. X
  52. X
  53. X#ifdef AZTEC_C             /* Works under Manx, convert it to Lattice */
  54. X                           /* if you don't mind the hassle...             */
  55. X
  56. X#include<intuition/intuition.h>
  57. X#include<intuition/intuitionbase.h>
  58. X#include<libraries/dos.h>
  59. X#include<libraries/dosextens.h>
  60. X#include<stdio.h>
  61. X/* #define DEBUG 1 */
  62. X
  63. Xchar bodystring[80],extensions[10][10], titlebak[80], title[80];
  64. XULONG answer, EXT_SET = 0L,  howmany = 0L;
  65. XUBYTE *position, *rindex();
  66. X
  67. Xstruct FileHandle *output, *Output();
  68. X
  69. Xstruct NewWindow mywindow = {
  70. X   100,0,   /* window XY origin relative to TopLeft of screen */
  71. X   350,10,  /* window width and height */
  72. X   0,1,  /* detail and block pens */
  73. X   CLOSEWINDOW+VANILLAKEY, /* IDCMP flags */
  74. X   WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE+SIMPLE_REFRESH, /* other window flags */
  75. X   NULL, /* first gadget in gadget list */
  76. X   NULL, /* custom CHECKMARK imagery */
  77. X   (UBYTE *)title,   /* window title */
  78. X   NULL, /* custom screen pointer */
  79. X   NULL, /* custom bitmap */
  80. X   5,5,  /* minimum width and height */
  81. X   640,110, /* maximum width and height */
  82. X   WBENCHSCREEN   /* destination screen type */
  83. X   };
  84. X
  85. X
  86. Xstruct IntuiText body = {
  87. X   1,0,
  88. X   JAM1|COMPLEMENT,
  89. X   30,16,
  90. X   NULL,
  91. X   NULL,
  92. X   NULL
  93. X   };
  94. X
  95. Xstruct IntuiText fbody = {
  96. X   1,0,
  97. X   JAM1|COMPLEMENT,
  98. X   30,5,
  99. X   NULL,
  100. X   (UBYTE *) "System tries to fool around...",
  101. X   &body
  102. X   };
  103. X
  104. Xstruct IntuiText ok = {
  105. X   1,0,
  106. X   JAM1|COMPLEMENT,
  107. X   6,3,
  108. X   NULL,
  109. X   (UBYTE *)   "Yes, Delete!",
  110. X   NULL
  111. X   };
  112. X
  113. Xstruct IntuiText no = {
  114. X   1,0,
  115. X   JAM1|COMPLEMENT,
  116. X   6,3,
  117. X   NULL,
  118. X   (UBYTE *)  "Oops, No Way!",
  119. X   NULL
  120. X   };
  121. X
  122. X
  123. Xstruct IntuiMessage *msg, *GetMsg();
  124. X
  125. Xstruct IntuitionBase *IntuitionBase;
  126. Xstruct Window        *mw, *aw, *OpenWindow();
  127. Xstruct Library       *DosBase;
  128. XUBYTE                *filename;
  129. Xvoid                 *OpenLibrary();
  130. Xstruct Task          *FindTask();
  131. X
  132. Xvoid NoDelete()
  133. X{
  134. X#asm
  135. X   public   _LVOSetProtection
  136. X
  137. X   movem.l  d0-d7/a0-a6,-(sp)
  138. X#endasm
  139. X   geta4();
  140. X#asm
  141. X   move.l   d1,_filename
  142. X#endasm
  143. X
  144. X   if(EXT_SET)
  145. X      {
  146. X
  147. X      position = rindex(filename, '.');
  148. X      if(!position)
  149. X         goto delete_anyway;
  150. X      else
  151. X         {
  152. X         for(answer=0L; answer < howmany; answer++)         
  153. X            {
  154. X            if( (strcmp( (UBYTE *) position, (UBYTE *) extensions[answer])) != 0L)
  155. X               continue;
  156. X            else
  157. X               goto request;
  158. X            }
  159. X         }
  160. X      goto delete_anyway;     
  161. X      }  
  162. Xrequest:
  163. X   strcpy(bodystring, "Delete File `");
  164. X   strcat(bodystring, (char *)filename);
  165. X   strcat(bodystring, "'?");
  166. X   body.IText = (UBYTE *) bodystring;
  167. X   aw = (struct Window *) IntuitionBase->ActiveWindow;
  168. X   answer = (long)AutoRequest(aw, &fbody, &ok, &no, NULL, NULL, 360L, 61L);
  169. X   if(!answer)
  170. X   {
  171. X      ;
  172. X#asm
  173. X   movem.l  (sp)+,d0-d7/a0-a6
  174. X   move.l   #1,d0
  175. X#endasm
  176. X   return;
  177. X   }
  178. X
  179. X   if(answer)
  180. X   {
  181. X
  182. Xdelete_anyway:
  183. X      ;
  184. X#asm
  185. X
  186. X      move.l   _DosBase,a6    
  187. X      move.l   #$70f7,d0         ;Restore old vector
  188. X      move.w   d0,-72(a6)
  189. X      move.l   #$60000092,d0
  190. X      move.l   d0,-70(a6)
  191. X
  192. X      move.l   _filename,d1
  193. X      move.l   #0,d2
  194. X      jsr      _LVOSetProtection(a6)
  195. X
  196. X      move.l   _filename,d1
  197. X      jsr      -72(a6)           ;call DeleteFile() 
  198. X#endasm
  199. X
  200. X      ;
  201. X
  202. X      SetFunction(DosBase, -72L, &NoDelete);
  203. X
  204. X/* install our function */
  205. X
  206. X
  207. X#asm
  208. X      movem.l  (sp)+,d0-d7/a0-a6
  209. X      move.l   #1,d0
  210. X#endasm
  211. X      return;
  212. X      }
  213. X   }
  214. X      
  215. X
  216. Xvoid quit(why)
  217. XUBYTE *why;
  218. X{
  219. X   Write(output, why, (ULONG) strlen(why) );
  220. X   SetTaskPri((struct Task *)FindTask(0L), 0L);
  221. X   if(DosBase)
  222. X   {
  223. X      ;
  224. X#asm
  225. X      move.l   _DosBase,a6    
  226. X      move.l   #$70f7,d0         ;restore old vector
  227. X      move.w   d0,-72(a6)
  228. X      move.l   #$60000092,d0
  229. X      move.l   d0,-70(a6)
  230. X#endasm
  231. X      ;
  232. X   }
  233. X
  234. X   if (mw)
  235. X      CloseWindow(mw);
  236. X
  237. X   if (DosBase)   
  238. X      CloseLibrary(DosBase);
  239. X
  240. X   if (IntuitionBase)
  241. X      CloseLibrary(IntuitionBase);
  242. X
  243. X   exit(0L);
  244. X}
  245. X
  246. X/* test_nd() tests the DeleteFile vector to see if NoDelete is already 
  247. X   installed. Returns zero if NoDelete is installed, one if it is not.
  248. X*/
  249. X#asm
  250. X      public   _test_nd
  251. X_test_nd:
  252. X
  253. X      move.l   _DosBase,a6
  254. X      cmpi.l   #$60000092,-70(a6)
  255. X      bne.s    _is_there            
  256. X      moveq    #1,d0
  257. X      bra.s    _end
  258. X_is_there:
  259. X      moveq    #0,d0
  260. X_end:
  261. X      rts   
  262. X#endasm
  263. X
  264. Xvoid main(argc,argv)
  265. Xlong argc;
  266. Xchar *argv[];
  267. X   {
  268. X
  269. X   static UBYTE *msg1 = (UBYTE *)"Installing NoDelete...";
  270. X   static UBYTE *msg2 = (UBYTE *)"done. NoDelete V1.35E (c) HooverSoft 1990\n\n";
  271. X   long i;
  272. X
  273. X   DosBase = (struct Library *) OpenLibrary("dos.library",0L);
  274. X   output = Output();
  275. X   strcpy(title, (UBYTE *) "NoDelete V1.35E (c) HooverSoft");
  276. X   
  277. X   if(argc > 11)
  278. X      quit("Sorry, only 10 extensions allowed!\n");
  279. X
  280. X/* Der erste Teil dieser If-Anweisung sucht nach allen
  281. X   gueltigen Endungen, die zu finden sind.
  282. X*/
  283. X   if(argc >= 2)
  284. X      {
  285. X      for(i=1; i<argc; i++)
  286. X         {
  287. X   
  288. X         if(argv[i][0] == '.')
  289. X            {
  290. X            EXT_SET = 1L;
  291. X            strcpy(extensions[howmany], argv[i]);
  292. X            howmany++;
  293. X            }
  294. X         else
  295. X          continue;
  296. X
  297. X#ifdef   DEBUG
  298. X         printf("Copied %s, Result: %s\n", argv[i], extensions[i-1L]);
  299. X#endif   
  300. X         }
  301. X
  302. X#ifdef   DEBUG
  303. X      printf("I found %ld extensions.\n", howmany);
  304. X#endif         
  305. X
  306. X
  307. X/* Found any extensions in command line? 
  308. X   if we did, please display */
  309. X      if(howmany)
  310. X            strcat(title, (UBYTE *) " EXT SET");         
  311. X/* Search for options */
  312. X
  313. X      for(i=1; i<argc; i++)
  314. X         {
  315. X#ifdef DEBUG
  316. X         printf("Scanning argv[%ld]: %s\n", i, (UBYTE *) argv[i] );
  317. X#endif
  318. X         if( (char) argv[i][0] == '-')
  319. X            switch( (char) argv[i][1] )
  320. X               {
  321. X               case 'y':   if( atoi(argv[i+1]) <= 245L)
  322. X                              mywindow.TopEdge = atoi(argv[i+1]);
  323. X                           break;
  324. X
  325. X               case 'p':   if(atoi(argv[i+1]) < 10L && atoi(argv[i+1]) > -20L)
  326. X                              SetTaskPri((struct Task *)FindTask(0L),\
  327. X                                          (long)atoi(argv[i+1]));
  328. X                           else
  329. X                              SetTaskPri((struct Task *)FindTask(0L), -5L);
  330. X                           break;
  331. X
  332. X               case default: break;
  333. X               }
  334. X            /* end switch */
  335. X         /*end if */
  336. X      /*end for */
  337. X         }  
  338. X               
  339. X      }
  340. X
  341. X   if(!howmany)
  342. X      {
  343. X      EXT_SET = 0L;
  344. X      strcat(title, (UBYTE *) " NO EXT");
  345. X      }
  346. X
  347. X/* calculate dimension of TitleBar */
  348. X
  349. X   mywindow.Width = ( strlen(title) * 8L) + 85L;
  350. X   mywindow.LeftEdge = (640L-mywindow.Width) / 2L;
  351. X
  352. X   IntuitionBase =  OpenLibrary("intuition.library",0L);
  353. X   Write(output, msg1, (ULONG)strlen(msg1));
  354. X
  355. X   if( !test_nd() )
  356. X      {
  357. X      Write(output, "NoDelete already installed.\n",28L);
  358. X      CloseLibrary(DosBase);
  359. X      CloseLibrary(IntuitionBase);
  360. X      exit(0L);
  361. X      }
  362. X
  363. X   mw = OpenWindow(&mywindow);
  364. X   if(!mw)
  365. X      quit("Could not open Window.\n\n");
  366. X
  367. X   Write(output, msg2, (ULONG)strlen(msg2));
  368. X   SetFunction(DosBase, -72L, &NoDelete); 
  369. X
  370. X   for(;;)
  371. X      {
  372. X      Wait(1L << mw->UserPort->mp_SigBit);
  373. Xgetmsg:
  374. X      msg = GetMsg(mw->UserPort);
  375. X      ReplyMsg(msg);
  376. X      if (msg->Class == CLOSEWINDOW)
  377. X         quit("NoDelete V1.35E exiting.\n\n");
  378. X      if(msg->Class == VANILLAKEY)
  379. X         {
  380. X         strcpy(titlebak, (UBYTE *) "Extensions: ");
  381. X         for(i=0L; i < howmany ; i++)
  382. X            {
  383. X            strcat(titlebak, extensions[i]);
  384. X            strcat(titlebak, " ");
  385. X            }
  386. X         SetWindowTitles(mw, titlebak);
  387. X         Wait(1L << mw->UserPort->mp_SigBit);
  388. X         SetWindowTitles(mw, title);
  389. X         ReplyMsg( GetMsg(mw->UserPort) );
  390. X         }
  391. X
  392. X      else
  393. X         continue;
  394. X      }
  395. X   }
  396. X#endif   
  397. X   
  398. END_OF_FILE
  399. if test 7779 -ne `wc -c <'nodelete.c'`; then
  400.     echo shar: \"'nodelete.c'\" unpacked with wrong size!
  401. fi
  402. # end of 'nodelete.c'
  403. fi
  404. if test -f 'nodelete.doc' -a "${1}" != "-c" ; then 
  405.   echo shar: Will not clobber existing file \"'nodelete.doc'\"
  406. else
  407. echo shar: Extracting \"'nodelete.doc'\" \(6903 characters\)
  408. sed "s/^X//" >'nodelete.doc' <<'END_OF_FILE'
  409. X *************************************************************************
  410. X *              NoDelete V1.35 (C) HooverSoft  Aug 30th, 1990            *
  411. X *************************************************************************
  412. X
  413. XUSAGE:  1> run NoDelete [extensions] [-p priority] [-y ypos] <ENTER>
  414. X                        from CLI only.
  415. X
  416. X
  417. X
  418. X
  419. X                                  HISTORY
  420. X
  421. X                     CHANGES TO VERSION 1.3: SEP 1990
  422. XLots  of  changes.   Thinking  of  writing  a  new  documentation.  Anyway,
  423. Xintroduced  command line options -p and -y for run-time setting of priority
  424. Xof NoDelete and of vertical position of titlebar.
  425. X
  426. X                     CHANGES TO VERSION 1.2: AUG 1990
  427. XIntroduced  the  possibilty  to give multiple extensions on startup.  Lists
  428. Xextensions when pressing a key while Nodelete's titlebar is active.
  429. X
  430. X                     CHANGES TO VERSION 1.1: Aug 1990
  431. XNoDelete now automatically centers the Dragbar on Screen and calculates the
  432. Xcorrect width for the window if a extension is specified.
  433. X
  434. XNow  works  fine  with  AmiOmega.   System won't crash if "Yes, Delete!" is
  435. Xselected.
  436. X
  437. XNow  supports  the  use of extensions to ask confirmations only for special
  438. Xfiles  ending  in  defined  extension.  Will show the selected extension in
  439. Xwindow's titlebar.
  440. X
  441. XNoDelete  now  checks  if  another  NoDelete is already active and exits if
  442. Xtrue.
  443. X
  444. X                     CHANGES TO VERSION 1.01: Jul 1990
  445. XNow handles protected Files correctly.  Previous version didn't complain if
  446. Xfile was delete protected.
  447. X
  448. XNoDelete sets its priority to a value of -5 directly after startup.
  449. X
  450. X                    CHANGES TO VERSION 1.00: June 1990
  451. XVersion  1.01  now  restores  the  Dos Vector relative to _DosBase, so this
  452. Xprogram  should  work under Kickstart 1.3 as well.  If someone already uses
  453. XKick 2.0, he or she should let me know if NoDelete works with that.  I have
  454. Xheard  that  the  funny  instructions  in DosBase have been replaced with a
  455. Xregular jump table.
  456. X
  457. X
  458. X                           WHY USE NODELETE?
  459. XI  wrote  this  program  mainly  to  make  the fantastic public domain game
  460. X"Omega"  more  enjoyable  to  play.   The author of this program thought it
  461. Xreasonable to have the system unlink the save-file after having reloaded it
  462. Xto  somehow  "simulate the continuity of character".  Too bad that NoDelete
  463. Xdoes not work correctly with this program...
  464. X
  465. X                              WHAT IT DOES
  466. XNoDelete  enables  you  erraneous  humans  to  once  again  reflect  on the
  467. Xrighteousness  of  your  decisions  concerning  the  deleting  of  files on
  468. XAmigaDos devices.  If you try to delete a file or a program tries to remove
  469. Xit,  this  is  mostly  done  via  DeleteFile()  of  the  dos.library.  When
  470. Xexecuted,  NoDelete  bends  this  vector to its own routine which brings up
  471. Xthis  cute  little requester on the active window.  This requester contains
  472. Xthe  name  of  the file that the system is trying to delete.  If you really
  473. Xwant  to  delete  this  file,  click to the "Yes, Delete!" gadget.  If not,
  474. Xclick  to the "Oops, no way!"-Gadget of the requester.  NoDelete works just
  475. Xfine   with   aliases,   wildcards   etc.   For  problems  see  the  "known
  476. Xbugs"-section of this text.
  477. X
  478. X                                EXTENSIONS
  479. XLots  of  programs,  programmers  and normal people use extensions in their
  480. Xfile system to be able to immediately make out the contents of a file.  For
  481. Xexample,  ".c"  specifies  the file to be a C source code and ".bas" should
  482. Xcontain  a  basic  program's  source.   There  are  tons of frequently used
  483. Xextensions,  from  ".asm"  up to ".cfg".  If you use NoDelete and you don't
  484. Xwant  the  system to get on your nerves by confirming EVERY rm command, you
  485. Xshould  use a certain extension on NoDelete's command line to tell NoDelete
  486. Xthat  it  should  only  ask  confirmation for those precious ".c" or ".iff"
  487. Xfiles and let all others alone.
  488. X
  489. XThe command line
  490. X
  491. X                1> run nodelete .c
  492. X
  493. Xwould  tell NoDelete to only intercept the removing of files ending in ".c"
  494. Xand not to worry about any other files that are removed from the device.
  495. X
  496. XYou can specifiy up to ten extensions when running NoDelete. The command
  497. X
  498. X                1> run NoDelete .c .iff .tex .asm
  499. X
  500. Xwill  make  NoDelete  complain  about  any  file  which  ends in one of the
  501. Xspecified  extensions  and  leave  all others alone.  If you have forgotten
  502. Xwhich  extensions  you  specified  at  startup,  just  activate  NoDelete's
  503. Xtitlebar  and  press any key.  NoDelete will then give a list of extensions
  504. Xin the titlebar until another key is pressed.
  505. X
  506. X
  507. X
  508. X                           COMMAND LINE OPTIONS
  509. XFinally,  HooverSoft  is  proud  to have introduced command line options in
  510. XNoDelete.  So far, two options are supported:
  511. X
  512. X-p      number  where number is an integer between -20 and 9. If given on
  513. X        the command line, NoDelete will set its priority to this
  514. X        value.  If you type rubbish or use values not allowed, the
  515. X        default priority of -5 is set.
  516. X
  517. X-y ypos where ypos is an integer ranging from zero to 245
  518. X        This number will determine the ver-
  519. X        tical position of NoDelete's titlebar.  if you try to fool
  520. X        NoDelete or do not give this option, the default value zero
  521. X        (top of screen) is used.
  522. X
  523. X                               KNOWN BUGS
  524. XNoDelete  cannot  take  care of the AmigaDos command Delete.  God knows how
  525. Xthis command erases a disk file...
  526. X
  527. XThe  Shell  won't complain if you try to delete any non-existent file while
  528. XNoDelete  has  its  grip  on  the system.  This is not really a bug because
  529. XNoDelete  works  on  this  basis  of  cheating  the  calling  function  and
  530. Xpretending that everything is just fine and deleted.
  531. X
  532. XSometimes  it is possible to get two copies of NoDelete running at the same
  533. Xtime.   I  can't  explain  how  this is to be done, but somehow it works...
  534. XAnyway this happens very seldomly.
  535. X
  536. X                            THE LEGAL STUFF
  537. XNoDelete  is copyright (C) by HooverSoft.  It may not be copied or sold for
  538. Xcommercial   purposes.   It  may  be  distributed  and  copied  freely  for
  539. Xnon-commercial purposes only.
  540. X
  541. X                    FURTHER PLANS & HOPELESS DREAMS
  542. XI  would  like  to use CreateTask() to launch a separate Task for Nodelete.
  543. XThis would unlink NoDelete's memory requirements from the current stacksize
  544. Xof  the  system.  It would be nice if "delete" could also be disabled but I
  545. Xam not sure how to do this.
  546. X
  547. X                            PUBLIC FEEDBACK
  548. XBug  reports  (cheers, Jensi!), criticism, comments and approvements should
  549. Xbe sent to
  550. X
  551. X                                  SNAIL:
  552. X                              HooverSoft Inc.
  553. X                            Joellenbecker Weg 4
  554. X                              D-4900 Herford
  555. X                                  Germany
  556. X
  557. X                                  BITNET:
  558. X                       hoover@math4.uni-bielefeld.de
  559. X
  560. X
  561. XHave fun & God bless you,
  562. Xhoover
  563. END_OF_FILE
  564. if test 6903 -ne `wc -c <'nodelete.doc'`; then
  565.     echo shar: \"'nodelete.doc'\" unpacked with wrong size!
  566. fi
  567. # end of 'nodelete.doc'
  568. fi
  569. if test -f 'nodelete.uu' -a "${1}" != "-c" ; then 
  570.   echo shar: Will not clobber existing file \"'nodelete.uu'\"
  571. else
  572. echo shar: Extracting \"'nodelete.uu'\" \(6513 characters\)
  573. sed "s/^X//" >'nodelete.uu' <<'END_OF_FILE'
  574. Xbegin 644 nodelete
  575. XM```#\P`````````#``````````(```0:````N@````$```/I```$&D[Z!^I3J
  576. XM>7-T96T@=')I97,@=&\@9F]O;"!A<F]U;F0N+BX``%EE<RP@1&5L971E(0``P
  577. XM3V]P<RP@3F\@5V%Y(0!.50``2.?__DZZ"!0I08*22JR``F=22'@`+B\L@I).I
  578. XMN@:>4$\I0()V2JR"=F<``+1"K()R8"9R"B`L@G).N@XL0>R!;M"(+P`O+()V#
  579. XM3KH'+E!/2H!F`F`04JR"<B`L@G*PK(`&9=!@>DAZ`,!(;($>3KH&;%!/+RR"L
  580. XMDDAL@1Y.N@JX4$](>@"R2&R!'DZZ"JI03T'L@1XI2(!&(&R"@BEH`#2"BDAX4
  581. XM`#U(>`%H0J="ITAL@'9(;(!B2&R`3B\L@HI.N@\<3^\`("E`@G)*K()R9@I,U
  582. XMWW__<`%.74YU2JR"<F=&+&R"CB`\``!P]SU`_[@@/&```)(M0/^Z(BR"DG0`\
  583. XM3J[_1B(L@I).KO^X2'K^\DAX_[@O+(*.3KH.8D_O``Q,WW__<`%@L&"N1&5LY
  584. XM971E($9I;&4@8``G/P``3E4``"\M``A.N@6H6$\O`"\M``@O+()Z3KH-@D_OF
  585. XM``Q"IT*G3KH-OEA/+P!.N@XF4$]*K(*.9Q@L;(*.(#P``'#W/4#_N"`\8```"
  586. XMDBU`_[I*K(*&9PHO+(*&3KH.9%A/2JR"CF<*+RR"CDZZ#5I83TJL@H)G"B\LI
  587. XM@H).N@U*6$]"ITZZ"R!83TY=3G4L;(*.#*Y@``"2_[IF!'`!8`)P`$YU3E7_:
  588. XM_$*G2'H$!TZZ#6Y03RE`@HY.N@S(*4"">DAZ`_U(;((B3KH$VE!/#*T````+Q
  589. XM``AO"DAZ!`).NO\D6$\,K0````(`"&T``9`K?`````'__&!*("W__.6`(&T`C
  590. XM#")P"``,$0`N9C(I?`````&``B`M__SE@"!M``PO,`@`<@H@+(`&3KH,!D'LS
  591. XM@6[0B"\`3KH$;E!/4JR`!E*M__P@+?_\L*T`"&VL2JR`!F<.2'H#K$AL@B).;
  592. XMN@BB4$\K?`````'__&```08@+?_\Y8`@;0`,(G`(``P1`"UF``#L("W__.6`V
  593. XM(&T`#")P"``0*0`!2(!(P&```+P@+?_\4H#E@"!M``PO,`@`3KH$&%A/L+P`/
  594. XM``#U;AH@+?_\4H#E@"!M``PO,`@`3KH#^EA/.4"`#&```)8@+?_\4H#E@"!MO
  595. XM``PO,`@`3KH#W%A/L+P````*;$@@+?_\4H#E@"!M``PO,`@`3KH#OEA/L+S_%
  596. XM___L;RH@+?_\4H#E@"!M``PO,`@`3KH#H%A/+P!"ITZZ"[983R\`3KH,'E!/<
  597. XM8!1(>/_[0J=.N@N@6$\O`$ZZ#`A03V`88!:0O````'!G`/]ZD+P````)9P#_@
  598. XM-&#H4JW__"`M__RPK0`(;0#^\DJL@`9F$D*L@`)(>@*!2&R"(DZZ!VY03TAL1
  599. XM@B).N@,:6$_G@-"\````53E`@`X@/````H`R+(`.2,&0@7("3KH(0CE`@`I"N
  600. XMITAZ`DM.N@M44$\I0(*"+RR`BDZZ`MQ83R\`+RR`BB\L@GI.N@JV3^\`#$ZZ@
  601. XM_9Y*@&8P2'@`'$AZ`B<O+()Z3KH*FD_O``PO+(*.3KH*N%A/+RR"@DZZ"JY8B
  602. XM3T*G3KH(A%A/2&R`"DZZ"Z)83RE`@H9*K(*&9@I(>@($3KK\PEA/+RR`CDZZ2
  603. XM`FI83R\`+RR`CB\L@GI.N@I$3^\`#$AZ^V1(>/^X+RR"CDZZ"M1/[P`,(&R"C
  604. XMAB)H`%9P`!`I``]R`>&A+P%.N@K<6$\@;(*&+R@`5DZZ"G983RE`@GXO+()^,
  605. XM3KH*C%A/(&R"?@RH```"```49@I(>@&?3KK\1%A/(&R"?@RH`"`````49@``V
  606. XMFDAZ`:!(;('23KH!R%!/0JW__&`N<@H@+?_\3KH)0D'L@6[0B"\`2&R!TDZZU
  607. XM!@!03TAZ`7U(;('23KH%\E!/4JW__"`M__RPK(`&9<A(;('2+RR"ADZZ"K)09
  608. XM3R!L@H8B:`!6<``0*0`/<@'AH2\!3KH*)%A/2&R"(B\L@H9.N@J*4$\@;(*&'
  609. XM+R@`5DZZ";!83R\`3KH)S%A/8`#_"$Y=3G5);G-T86QL:6YG($YO1&5L971EB
  610. XM+BXN`&1O;F4N($YO1&5L971E(%8Q+C,U12"I($AO;W9E<E-O9G0@,3DY,`H*/
  611. XM`&1O<RYL:6)R87)Y`$YO1&5L971E(%8Q+C,U12"I($AO;W9E<E-O9G0`4V]RG
  612. XM<GDL(&]N;'D@,3`@97AT96YS:6]N<R!A;&QO=V5D(0H`($585"!3150`($Y/W
  613. XM($585`!I;G1U:71I;VXN;&EB<F%R>0!.;T1E;&5T92!A;')E861Y(&EN<W1AH
  614. XM;&QE9"X*`$-O=6QD(&YO="!O<&5N(%=I;F1O=RX*"@!.;T1E;&5T92!6,2XS%
  615. XM-44@97AI=&EN9RX*"@!%>'1E;G-I;VYS.B``(```(&\`!")(2AAF_%.($"\`9
  616. XM"[/(9PBP(&;X(`A.=7``3G4@;P`$(`@B;P`($-EF_$YU(&\`!"`(2AAF_)'`S
  617. XM(`A3@$YU3E4``$CG#"`D;0`(#!(`(&<&#!(`"68$4HI@\'H`#!(`+68&>@%2[
  618. XMBF`(#!(`*V8"4HIX`&`@($I2BA`02(!(P'(*+P`@!$ZZ!R(B']*`*`&8O```]
  619. XM`#`0$DB`2,!![("3"#```@@`9LY*A6<&(`1$@&`"(`1,WP0P3EU.=3`\?_]@9
  620. XM!#`O``Y30&L4(&\`!")O``BQ"68,4TA*&%?(__9P`$YU8P1P`4YU</].=6%P]
  621. XM0^R!'D7L@1ZUR68.,CP`<FL(=``BPE')__PI3X*6+'@`!"E.@II(YX"`""X``
  622. XM!`$I9Q!+^@`(3J[_XF`&0J?S7TYS0_H`($ZN_F@I0(*>9@PN/``#@`=.KO^4N
  623. XM8`1.N@`:4$].=61O<RYL:6)R87)Y`$GY``!__DYU3E4``"\*2'D``0``,"R!.
  624. XM%,'\``8O`$ZZ!M0I0(*B4$]F%$*G2'D``0``3KH&F%!/+FR"EDYU(&R"HD)H-
  625. XM``0@;(*B,7P``0`0(&R"HC%\``$`"B!L@I8@+(*6D*@`!%"`*4""IB!L@J8@3
  626. XMO$U!3EA"ITZZ!HPD0$JJ`*Q83V<P+RT`#"\M``@O"DZZ`+(I?`````&"JB!L2
  627. XM@J(`:(````0@;(*B`&B````*3^\`#&!"2&H`7$ZZ!M)(:@!<3KH&:BE`@JX@+
  628. XM;(*N2J@`)%!/9Q`@;(*N(F@`)"\13KH%FEA/+RR"KB\*3KH">"EL@JZ"LE!/>
  629. XM3KH%CB!L@J(@@$ZZ!9X@;(*B(4``!F<62'@#[4AZ`"Q.N@5V(&R"HB%```Q0X
  630. XM3R\L@K(O+(*V3KKXD$*G3KH#C$_O``PD7TY=3G4J`$Y5``!(YPPP)&T`$"!MB
  631. XM``A*J`"L9Q@@;0`(("@`K.6`*``@1"`H`!#E@"9`8`0F;($6$!-(@$C`T*T`_
  632. XM#%2`*4""ND*G+RR"NDZZ!68I0(*^4$]F"$S?##!.74YU$!-(@$C`*@`O!2!+_
  633. XM4H@O""\L@KY.N@&.(&R"OM'%0_H!6!#99OPO+0`,+PHO+(*^3KH!3B!L@KY"G
  634. XM,%@`*7P````!@K8@;(*^T<4F2%*+)$M/[P`8$!-(@$C`*@"PO````"!G(+J\^
  635. XM````"6<8NKP````,9Q"ZO`````UG"+J\````"F8$4HM@S`P3`"!M``",#!,`]
  636. XM(F8R4HL@2U*+$!!(@$C`*@!G("!*4HH0A;J\````(F80#!,`(F8$4HM@!D(J#
  637. XM__]@`F#28$0@2U*+$!!(@$C`*@!G,+J\````(&<HNKP````)9R"ZO`````QG#
  638. XM&+J\````#6<0NKP````*9P@@2E**$(5@PB!*4HI"$$J%9@)3BU*L@K9@`/\\\
  639. XM0A)"IR`L@K92@.6`+P!.N@0J*4""LE!/9@A"K(*V8`#^OGH`)FR"OF`>(`7E=
  640. XM@"!L@K(ABP@`($L@"$H89OR1P%.(4HC7R%*%NJR"MFW<(`7E@"!L@K)"L`@`R
  641. XM8`#^@B``,#Q__V`$,"\`#B!O``1*&&;\4T@B;P`(4T`0V5?(__QG`D(0("\`F
  642. XM!$YU3.\#```$(`@B+P`,8`(0V5?)__QG!E)!8`)"&%')__Q.=4Y5``!(YPXP8
  643. XM)&T`"$*G2'H`CDZZ`\0I0(+"4$]F"$S?#'!.74YU(&T`#")H`"0O*0`$3KH$?
  644. XM&B@`6$]G4DAZ`&T@1"\H`#9.N@/L)D!*@%!/9S1(>`/M+PM.N@+0+`!03V<D]
  645. XM(`;E@"H`($4E:``(`*0E1@"<2'@#[4AZ`#A.N@*L)4``H%!/+P1.N@.X6$\OJ
  646. XM+(+"3KH"ZD*L@L)83V"`:6-O;BYL:6)R87)Y`%=)3D1/5P`J`$CG2`!"A$J`R
  647. XM:@1$@%)$2H%J!D2!"D0``6$^2D1G`D2`3-\`$DJ`3G5(YT@`0H1*@&H$1(!2&
  648. XM1$J!:@)$@6$:(`%@V"\!81(@`2(?2H!.=2\!808B'TJ`3G5(YS``2$%*068@$
  649. XM2$$V`30`0D!(0(##(@!(0#("@L,P`4)!2$%,WP`,3G5(028!(@!"04A!2$!"#
  650. XM0'0/T(#3@;:!8@22@U)`4<K_\DS?``Q.=4Y5``!*K(+&9P8@;(+&3I`O+0`(5
  651. XM3KH`"%A/3EU.=4Y5__PO!"MM``C__$JL@J)G+'@`8`HO!$ZZ`/Q83U*$,"R!Q
  652. XM%$C`N(!M[#`L@13!_``&+P`O+(*B3KH"`%!/2JR"RF<&(&R"RDZ02JR!&F<*?
  653. XM+RR!&DZZ`7183TJL@LYG""!L@LX@K(+22JR"UF<*+RR"UDZZ`9183TJL@MIGZ
  654. XM"B\L@MI.N@&$6$]*K(+>9PHO+(+>3KH!=%A/2JR"XF<*+RR"XDZZ`6183RQX=
  655. XM``0(+@`$`2EG%"\-2_H`"DZN_^(J7V`&0J?S7TYS2JR"KF8J2JR"OF<B+RR"(
  656. XMNB\L@KY.N@%<("R"ME*`Y8`O`"\L@K).N@%*3^\`$&`.3KH!."\L@JY.N@%P'
  657. XM6$\@+?_\+FR"EDYU*!].74YU3E4``$CG#B`H+0`(<@8@!$ZZ`$0D0-7L@J)*Q
  658. XMA&T.,"R!%$C`N(!L!$J29A(I?`````*"YG#_3-\$<$Y=3G4P*@`$P'R``&8('
  659. XM+Q).N@`N6$]"DG``8.!(YW``-`'$P"8!2$/&P$A#0D/4@TA`P,%(0$)`T(),*
  660. XMWP`.3G4B+P`$+&R"GD[N_]PB+P`$+&R"GD[N_X(L;(*>3N[_RDSO``8`!"QLX
  661. XM@IY.[O_B3OH``BQL@IY.[O_$3OH``B(O``0L;(*>3N[_ID[Z``),[P`.``0LY
  662. XM;(*>3N[_T$CG`01,[R"```PL;(*:3J[_E$S?((!.=4[Z``(B;P`$+&R"FD[N2
  663. XM_F),[P`#``0L;(*:3N[_.D[Z``(B;P`$+&R"FD[N_MHL;(*:3N[_?")O``0@2
  664. XM+P`(+&R"FD[N_RY.^@`"(&\`!"QL@II.[OZ,3OH``BQL@IHB;P`$("\`"$[N1
  665. XM_=A.^@`"(F\`!"QL@II.[OZ&(F\`!"!O``@@+P`,+&R"FD[N_EPB;P`$("\`=
  666. XM""QL@II.[O[4("\`!"QL@II.[O["(&\`!"QL@II.[OZ`3.\#```$+&R"PD[NH
  667. XM_Z`@;P`$+&R"PD[N_Z8@;P`$+&R"PD[N_[)(YP`P3.\/```,3.\`#P`<+&R"`
  668. XM@DZN_J1,WPP`3G4@;P`$+&R"@D[N_[@@;P`$+&R"@D[N_S0O"DSO!P``""QLU
  669. XM@H).KO[L)%].=0```^P````!`````0``"&`````````#\@```^H```!'````R
  670. XM````````9````5X`"@`!`"`"`````$X``````````````B`````````````%E
  671. XM``4"@`!N``$!``(``!X`$`````````````````$``@``'@`%``````````0`1
  672. XM```X`0`"```&``,`````````)``````!``(```8``P`````````R````````F
  673. XM!>P```8#`"`@("`@("`@(#`P,#`P("`@("`@("`@("`@("`@("`@D$!`0$!`:
  674. XM0$!`0$!`0$!`0`P,#`P,#`P,#`Q`0$!`0$!`"0D)"0D)`0$!`0$!`0$!`0$!Z
  675. XM`0$!`0$!`0%`0$!`0$`*"@H*"@H"`@("`@("`@("`@("`@("`@("`D!`0$`@,
  676. XM```4``````````````/L`````@````$````B````7`````4`````````6```A
  677. XB`&P```"`````B````(P````````#\@```^L````!```#\@4`>
  678. X``
  679. Xend
  680. Xsize 4624
  681. END_OF_FILE
  682. if test 6513 -ne `wc -c <'nodelete.uu'`; then
  683.     echo shar: \"'nodelete.uu'\" unpacked with wrong size!
  684. fi
  685. # end of 'nodelete.uu'
  686. fi
  687. if test -f 'readme.txt' -a "${1}" != "-c" ; then 
  688.   echo shar: Will not clobber existing file \"'readme.txt'\"
  689. else
  690. echo shar: Extracting \"'readme.txt'\" \(399 characters\)
  691. sed "s/^X//" >'readme.txt' <<'END_OF_FILE'
  692. X                                readme.txt
  693. X
  694. XNoDelete is a program that intercepts the DeleteFile()-Call of dos.library.
  695. XIt allows the declaration of certain file name extensions to only intercept
  696. Xdeletion  of  files  having these extensions and not bother about the rest.
  697. XNoDelete  is  CopyRight  (c) HooverSoft 1990.  It is freely redistributable
  698. Xfor non-commercial purposes only.
  699. X
  700. XEnjoy,
  701. X        Hoover
  702. END_OF_FILE
  703. if test 399 -ne `wc -c <'readme.txt'`; then
  704.     echo shar: \"'readme.txt'\" unpacked with wrong size!
  705. fi
  706. # end of 'readme.txt'
  707. fi
  708. echo shar: End of archive 1 \(of 1\).
  709. cp /dev/null ark1isdone
  710. MISSING=""
  711. for I in 1 ; do
  712.     if test ! -f ark${I}isdone ; then
  713.     MISSING="${MISSING} ${I}"
  714.     fi
  715. done
  716. if test "${MISSING}" = "" ; then
  717.     echo You have the archive.
  718.     rm -f ark[1-9]isdone
  719. else
  720.     echo You still need to unpack the following archives:
  721.     echo "        " ${MISSING}
  722. fi
  723. ##  End of shell archive.
  724. exit 0
  725. -- 
  726. Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
  727. Mail comments to the moderator at <amiga-request@uunet.uu.net>.
  728. Post requests for sources, and general discussion to comp.sys.amiga.
  729.